package com.FundamentalDemos.ObjectOriented;

/**
 * 学生类
 * 包含属性:
 * 姓名,语文成绩,数学成绩
 * 包含函数:
 * 求总分,求平均分函数
 */
public class Student {
    //成员变量(对象的属性)
    //成员变量有初始值,与数组对象的默认值一致
    /*
    基本类型中:
    byte,short,char,int,long 为 0
    float,double 为 0.0
    boolean 为 false
    引用类型中:
    类,接口,数组,String 为 null
     */
    byte b;
    short s;
    char c;
    int t;
    long l;
    float f;
    double d;
    boolean bo;
    String string;


    /**
     * 用于展示各种类型的默认值
     */
    public void showDefaultValue() {
        System.out.println("b = " + b);
        System.out.println("s =" + s);
        System.out.println("c = " + (int) c);
        System.out.println("t = " + t);
        System.out.println("l = " + l);
        System.out.println("f = " + f);
        System.out.println("d = " + d);
        System.out.println("bo = " + bo);
        System.out.println("stirng = " + string);
    }


    String name;//姓名
    double chinese;//语文成绩
    double math;//数学成绩


    //成员方法(对象的行为)

    /**
     * 展示学生信息
     */
    public void show() {
        System.out.println(name + "  语文成绩为:" + chinese + "   数学成绩为:" + math);
    }

    /**
     * 打印总成绩
     */
    public void printTotalScore() {//不能声明成静态static
        System.out.println(name + "的总成绩是" + (chinese + math));
    }

    /**
     * 打印平均成绩
     */
    public void printAverageScore() {
        System.out.println(name + "的平均成绩是" + (chinese + math) / 2.0);
    }

    /**
     * 打印本对象的地址
     */
    public void printThis() {
        System.out.println(this);
    }


    //↓this关键字用于解决形参与成员变量重名而歧义的问题↓

    /**
     * 判断this.math是否大于math
     *
     * @param math
     */
    public void isPass(double math) {
        if (this.math > math) {//如果这里不使用this,会导致前后的math都是形参中的math,导致逻辑表达式永远为false,因为外面的成员变量math被屏蔽了
            System.out.println("你通过了数学考试!");
        } else {
            System.out.println("你没有通过数学考试!");
        }
    }


    //构造函数无返回值,名称与类名相同. 构造函数常用来初始化成员变量
    // 构造函数可以重载.
    //如果一个类没有构造函数,编译器会为该类自动生成一个无参构造函数; 而一旦定义了构造函数,编译器就不会自动生成无参构造函数了,需要额外手写一个无参构造函数

    /**
     * 3参构造函数(全参构造函数)
     *
     * @param name
     * @param chinese
     * @param math
     */
    public Student(String name, double chinese, double math) {
        System.out.println("3参构造函数被调用了!");
        this.name = name;
        this.chinese = chinese;
        this.math = math;
    }

    /**
     * 无参构造函数
     */
    public Student() {
        System.out.println("无参构造函数被调用了!");
    }

    /**
     * 1参构造函数
     *
     * @param name
     */
    public Student(String name) {
        System.out.println("1参构造函数被调用了!");
        this.name = name;
    }

    //如果把构造函数声明成private私有的,那么类外都无法new该类对象了

}

/**
 * 一个.java源文件中可以定义多个类,但只能有一个public修饰,且public修饰的类名必须成为文件名
 */

class Xixi {//合法

}

//public class Haha {//报错
// 类 'haha' 为 public，应在文件 'haha.java' 中声明
//}

